#!/usr/bin/env python3
"""
perl-Parse-Yapp MCP Server

面向 perl-Parse-Yapp 软件的 yapp 命令行工具，提供语法解析器生成相关的 MCP 工具。

MCP tools 列表：
- yapp_generate_grammar: 基本语法文件生成
- yapp_generate_with_module: 使用 -m 选项指定模块名生成语法文件
- yapp_generate_with_verbose: 使用 -v 选项生成详细输出文件
- yapp_generate_standalone: 使用 -s 选项生成独立解析器
- yapp_generate_no_line_directives: 使用 -n 选项不生成行指令
- yapp_generate_with_output: 使用 -o 选项指定输出文件名
- yapp_generate_with_trace: 使用 -t 选项生成跟踪信息
- yapp_generate_with_banner: 使用 -b 选项指定 banner
- yapp_show_version: 显示版本信息
- yapp_show_help: 显示帮助信息

所有工具返回统一 JSON 结构：
{
  "success": bool,      # 命令执行是否成功（exit_code == 0）
  "command": str,       # 实际执行的完整命令
  "exit_code": int,     # 命令退出码
  "stdout": str,        # 标准输出内容
  "stderr": str         # 标准错误输出内容
}
"""

import subprocess
import shlex
from typing import List, Optional
from mcp.server.fastmcp import FastMCP, Context

mcp = FastMCP("Perl-Parse-Yapp MCP Server")

@mcp.tool()
def yapp_generate_grammar(grammar_file: str, context: Context) -> dict:
    """
    使用 yapp 生成基本的语法解析器文件
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_with_module(grammar_file: str, module_name: str, context: Context) -> dict:
    """
    使用 -m 选项指定模块名生成语法文件
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
        module_name: 模块名称（如 grammar）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -m {shlex.quote(module_name)} {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_with_verbose(grammar_file: str, context: Context) -> dict:
    """
    使用 -v 选项生成详细输出文件
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -v {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_standalone(grammar_file: str, context: Context) -> dict:
    """
    使用 -s 选项生成独立解析器
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -s {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_no_line_directives(grammar_file: str, context: Context) -> dict:
    """
    使用 -n 选项不生成行指令
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -n {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_with_output(grammar_file: str, output_file: str, context: Context) -> dict:
    """
    使用 -o 选项指定输出文件名
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
        output_file: 输出文件路径（如 mygrammar.pl）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -o {shlex.quote(output_file)} {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_with_trace(grammar_file: str, trace_file: str, context: Context) -> dict:
    """
    使用 -t 选项生成跟踪信息
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
        trace_file: 跟踪文件路径（如 mygrammar.output）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -t {shlex.quote(trace_file)} {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_generate_with_banner(grammar_file: str, banner: str, output_file: str, context: Context) -> dict:
    """
    使用 -b 选项指定 banner
    
    参数:
        grammar_file: 语法文件路径（如 mygrammar.yp）
        banner: banner 字符串（如 '/usr/local/bin/perl -w'）
        output_file: 输出文件路径（如 mygrammar2.pl）
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = f"yapp -b {shlex.quote(banner)} -o {shlex.quote(output_file)} {shlex.quote(grammar_file)}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_show_version(context: Context) -> dict:
    """
    显示 yapp 版本信息
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = "yapp -V"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def yapp_show_help(context: Context) -> dict:
    """
    显示 yapp 帮助信息
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    command = "yapp -h"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": command,
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

if __name__ == "__main__":
    mcp.run()